package com.engine.cn.mq;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
public class MessageConsumer {
    @RabbitListener(queues = "demo.queue")
    public void receiveMessage(Message message, Channel channel) throws IOException {
        try {
            // 获取消息体
            String msg = new String(message.getBody());
            System.out.println("收到消息: " + msg);

            // 业务处理逻辑
            processMessage(msg);

            // 手动确认消息（第二个参数表示是否批量确认）
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);

        } catch (Exception e) {
            // 处理异常，决定是否重新入队
            channel.basicNack(
                    message.getMessageProperties().getDeliveryTag(),
                    false,  // 是否批量处理
                    true    // 是否重新入队
            );
            // 或者拒绝消息且不重新入队，我们使用的是这种，基站定位的方式
            // channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
        }
    }

    private void processMessage(String msg) {
        // 你的业务逻辑
    }
}
